Introduzione all'assembly
Gennaio 2000 - Cosma Colanicchia
cloud.cc@tiscalinet.it
Ottimizzato per la risoluzione di 1024x768 pixel
appendice
sistemi
di numerazione
le
istruzioni dell'i8086
sistemi di
numerazione Normalmente siamo
abituati ad usare il sistema di numerazione base 10: abbiamo a disposizione 10 simboli
(0-9). Nel computer però è fisicamente molto difficile conservare informazioni in questo
modo. Molto più comodo utilizzare solo due simboli: 0 ed 1 (oppure Alto e Basso, Vero e
Falso...). Il sistema che utilizza solo i simboli 0 ed 1 si chiama sistema binario.
Come il sistema decimale, anche quello binario è un sistema di numerazione posizionale,
cioè in cui il valore di una cifra dipende dalla posizione che occupa all'interno del
numero.
Nel sistema decimale, il numero 234 vale:
4 * 10 0 + 3 * 10 1 + 2 * 10 2 = 4 * 1 + 3 * 10 + 2 * 100
= 4 + 30 + 200 = 234
ogni cifra cioè ha valore base di numerazione posizione, dove la
posizione 0 è quella corrispondente all'ultima cifra (a destra).
In binario il processo è analogo:
In binario, il numero (a quattro bit) 0110 vale:
0 * 2 0 + 1 * 2 1 + 1 * 2 2 + 0 * 2 3 = 0 * 1
+ 1 * 2 + 1 * 4 + 0 * 8 = 0 + 2 + 4 + 0 = 6
e infatti 0110 è la configurazione binaria del numero decimale 6.
Abbiamo già visto, così, come si converte un numero da base
2 a base 10. Vediamo ora il processo inverso: per ottenere il valore binario di un numero
decimale si utilizza la tecnica delle divisioni successive: si divide il numero per 2, poi
si considera il quoziente e si divide di nuovo per due e così via fino a quando il
quoziente non diventa 0. Allora, prendendo i resti delle divisioni nell'ordine invertito
(partendo dall'ultimo) otteniamo la configurazione base 2.
esempio: convertire il numero 610 a 62
(vediamo se corrisponde :-)
6/2 = quoziente 3 resto 0
3/2 = quoziente 1 resto 1
1/2 = quoziente 0 resto 1
prendiamo i resti al contrario: 110, che è equivalente al
valore 01102 che avevamo visto essere uguale a 610
Vediamo una tabella dei primi numero decimali e i
corrispondenti valori binari
Base 10 | Base 2 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
13 | 1101 |
14 | 1110 |
15 | 1111 |
vediamo che con 4 bit possiamo arrivare a contare 16
valori (da 0 a 15). Più in generale, con n bit possiamo contare 2n numeri.
Con 8 bit possiamo contare 256 diverse configurazioni binare, con 16 bit 65536
configurazioni e così via.
Ma se volessimo contare numeri negativi? in questo caso
dobbiamo utilizzare una notazione molto simile a quella binaria pura, detta complemento
a due. Per calcolare il valore in complemento a due di un numero binario basta
complementare tutti i bit del numero (ogni bit se è 0 diventa 1, se è 1 diventa 0: si
tratta dell'operazione logica NOT), e poi bisogna aggiungere 1 al risultato (l'addizione
in binario è praticamente identica a quella base 10, basta considerare che utilizziamo
sono due simboli anzichè 10). Vediamo:
Abbiamo il valore 510 = 1012 :
calcoliamo quanto vale -5 in notazione complemento a 2
0 1 0 1 valore binario del numero
assoluto
1 0 1 0 valore binario complementato
1 0 1 1 valore binario complementato + 1
1011 è il valore di -5.
NB Se avessimo calcolato il risultato su 3 bit anzichè su
quattro, il primo bit sarebbe andato perso e l'OF (flag di overflow) sarebbe stato posto a
1
Proviamo ad addizionare il valore di 5 e di - 5:
![]() |
La somma è molto simile a quella classica in decimale |
![]() |
1 + 1 = 10 scrivo 0 e riporto di 1 |
![]() |
0 + 1 + 1 = 10 scrivo 0 e riporto di 1 |
![]() |
0 + 1 + 1 = 10 scrivo 0 e riporto di 1 |
![]() |
0 + 1 + 1 = 10 scrivo 0 e riporto 1 sulla prima cifra |
Vediamo che il risultato, se consideriamo solo i nostri 4 bit, è 0 come dovrebbe essere.
Un altro sistema di numerazione molto utilizzato è quello
esadecimale, base 16. Abbiamo a disposizione 16 simboli: i primi dieci sono
visualizzati come numero (0 - 9) e i restanti con le prime 6 lettere dell'alfabeto (A -
F). Con una singola cifra possiamo contare quindi da 0 a F. Contare in esadecimale è
molto comodo, perchè ad ogni cifra base sedici corrispondono esattamente 4 cifre binarie
(ricordate la tabella di poco fa?). La conversione tra questi due formati è quindi molto
immediata:
calcoliamo quanto vale 00010101 binario in esadecimale: basta
prendere cifre quattro a quattro e risalire al corrispondente valore esadecimale:
0001 = 1
1100 = C
quindi il valore esadecimale è 1Ch (si legge "uno C
esadecimale")
Vediamo la tabella completa con i tre sistemi di numerazione
che ci interessano.
Decimale | Binario | Esadecimale |
0 | 0 | 0 |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
Qui sono riportate le istruzioni dell'8086.